Scenario

Command Design Pattern은 시스템의 모든 변경 이력을 기록해두고, 상태를 되돌릴 수 있는 구현 방법이다.
시스템의 모든 임의의 과거가 아닌 특정 시점으로 되돌리고 싶은 경우, Memento Design Pattern을 사용한다.

Memento Design Pattern
메멘토 패턴은 특정 시점의 시스템 상태를 전용 객체에 저장하여 리턴한다.
해당 객체는 읽기 전용 속성만 가지며 그 자체로는 어떠한 동작도 수행하지 않음
이와 같은 객체를 “Token”이라고 한다. (이 후 필요할 때, 시스템에 주입되어 저장되어 있는 상태로 되돌림)
Scenario
class Memento{
int balance;
public:
Memento(int balnace): balance(balance) {}
friend class BankAccount;
};
class BankAccount{
int balance=0;
public:
explicit BankAccount(const int balance): balance(balance) {}
Memento deposit(int amount){ // Memento
balance+=amount;
return {balance};
}
void restore(const Moneto& m){
balance=m.balance;
}
};
Memento는 불변 속성을 가져야 하며,
BankAccount에서 balance 필드 변수에 접근하기 위해 class BankAccount를 friend로 선언한다.
(혹은, BankAccount 내부 클래스; 중첩 클래스로 정의)
int main(void){
BankAccount ba{100};
auto m1=ba.deposit(50);
auto m2=ba.deposit(25); // m1, m2 Momento
cout<<ba<<'\n'; // operator<<
// m1 undo
ba.restore(m1);
cout<<ba<<'\n';
// m2
ba.restore(m2);
cout<<ba<<'\n';
}
하지만, 생성자는 반환값이 없기 때문에 초기의 balance 값으로 리턴할 수 없다.
(포인터를 이용해서 기록할 수 있지만, 코드가 지저분해질 수 있다.)